package top.ezzz.config;

import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.noear.solon.annotation.Component;
import org.noear.solon.core.NvMap;
import org.noear.solon.core.handle.Context;
import org.noear.solon.core.handle.Filter;
import org.noear.solon.core.handle.FilterChain;
import top.ezzz.common.R;

@Slf4j
@Component
public class AppFilter implements Filter {

    /**
     * 用于 异常处理
     *
     * @param ctx
     * @param chain
     * @throws Throwable
     */
    @Override
    public void doFilter(Context ctx, FilterChain chain) throws Throwable {
        //1.开始计时（用于计算响应时长）
        long start = System.currentTimeMillis();
        NvMap nvMap = ctx.paramMap();
        log.info("请求地址：" + ctx.path());
        log.info("请求参数：" + JSONUtil.toJsonStr(nvMap));
        try {
            chain.doFilter(ctx);
            //2.未处理设为404状态
            if (!ctx.getHandled()) {
                ctx.status(404);
            }
            //3.404状态的定制（也可对别的状态处理）
            if (ctx.status() == 404) {
                ctx.setHandled(true);
                ctx.output(R.error("请求路径不存在").toString());
            }
        } catch (Throwable e) {
            if (e instanceof AppException) {
                ctx.setHandled(true);
                ctx.status(200);
                ctx.output(R.error(((AppException) e).getMsg()).toString());
            } else {
                //4.异常捕促与控制（并标为500错误）
                ctx.status(500);
                ctx.setHandled(true);
                ctx.output(R.error(e.getMessage()).toString());
                log.error("请求异常： ", e);
            }
        }
        //5.获得接口响应时长
        long times = System.currentTimeMillis() - start;
        log.info("用时：" + times);
    }
}
